#pragma once

#include <string>

// 清洗字符串，去除其中非汉字字符的内容
class ChineseExtractor {
public:
    static std::string extract(const std::string& text) {
        std::string result;
        result.reserve(text.length()); // 预分配空间提高性能
        
        for (size_t i = 0; i < text.length(); ) {
            unsigned char c = text[i];
            
            if (isChineseCharacter(text, i)) {
                // 汉字，添加到结果
                result.append(text, i, 3);
                i += 3;
            } else {
                // 非汉字，跳过
                skipCharacter(text, i);
            }
        }
        
        return result;
    }

private:
    static bool isChineseCharacter(const std::string& text, size_t pos) {
        if (pos + 2 >= text.length()) return false;
        
        unsigned char c1 = text[pos];
        unsigned char c2 = text[pos + 1];
        
        // 快速判断是否是3字节UTF-8字符
        if ((c1 & 0xF0) != 0xE0) return false;
        
        // 汉字范围判断
        return (c1 == 0xE4 && c2 >= 0xB8) ||  // 4E00-4FFF
               (c1 == 0xE5) ||                // 5000-5FFF
               (c1 == 0xE6) ||                // 6000-6FFF
               (c1 == 0xE7) ||                // 7000-7FFF
               (c1 == 0xE8) ||                // 8000-8FFF
               (c1 == 0xE9 && c2 <= 0xBE) ||  // 9000-9FFF
               (c1 == 0xE3 && c2 >= 0x90) ||  // 3400-3FFF
               (c1 == 0xE4 && c2 >= 0x80 && c2 <= 0xB6); // 4000-4DBF
    }
    
    static void skipCharacter(const std::string& text, size_t& pos) {
        if (pos >= text.length()) return;
        
        unsigned char c = text[pos];
        
        if ((c & 0x80) == 0) {
            // ASCII字符
            pos++;
        }
        else if ((c & 0xE0) == 0xC0) {
            // 2字节UTF-8
            pos += 2;
        }
        else if ((c & 0xF0) == 0xE0) {
            // 3字节UTF-8（非汉字）
            pos += 3;
        }
        else if ((c & 0xF8) == 0xF0) {
            // 4字节UTF-8
            pos += 4;
        }
        else {
            // 无效UTF-8
            pos++;
        }
    }
};
